home *** CD-ROM | disk | FTP | other *** search
- unit MyMemory;
-
- { Memory manager functions }
-
- interface
-
- {$IFC MACTARGET}
- uses
- Types, Memory;
- {$ENDC}
-
- {$IFC WINTARGET}
- uses
- MyWinUtils;
- {$ENDC}
-
- { Mod. PhC 31/05/01: Les Handle ne sont disponibles que sur le Mac. }
- {$IFC MACTARGET}
- function MyNewHandle(logicalSize: LongInt): Handle;
- {$ENDC}
-
- {$IFC WINTARGET}
-
- function NewPtrClear(logicalSize: LongInt): Ptr;
- {$IFC DLLTARGET}
- DLLEXPORT;
- {$ENDC}
-
- procedure DisposePtr(p: univ Ptr);
- {$IFC DLLTARGET}
- DLLEXPORT;
- {$ENDC}
-
- procedure SetPtrSize(var p: univ Ptr; logicalSize: LongInt);
- {$IFC DLLTARGET}
- DLLEXPORT;
- {$ENDC}
-
- function GetPtrSize(p: univ Ptr): LongInt;
- {$IFC DLLTARGET}
- DLLEXPORT;
- {$ENDC}
-
- function MemError: OSErr;
- {$IFC DLLTARGET}
- DLLEXPORT;
- {$ENDC}
-
- procedure BlockMoveData(source: univ Ptr; dest: univ Ptr; nb: LongInt);
- {$IFC DLLTARGET}
- DLLEXPORT;
- {$ENDC}
-
- {$ENDC}
-
- implementation
-
- {$IFC MACTARGET}
- function MyNewHandle(logicalSize: LongInt): Handle;
-
- { Mod. PhC 20/07/00: }
- { J'ai rajouté une vérification de la taille de mémoire disponible avec MaxBlock }
- { car NewHandle plantait quelquefois si logicalSize était trop gros, i.e. le programme }
- { gelait au lieu de continuer avec h = nil. L'appel à la mémoire temporaire fonctionne }
- { bien maintenant. J'ai aussi remplacé NewHandleClear par NewHandle vu qu'il n'existe pas }
- { de TempNewHandleClear, et j'ai vérifié que mon code ne dépend plus que le handle soit }
- { 'clear', ou rempli de zéros. Cela est effectué manuellement lorsque nécessaire. }
- var
- h: Handle;
- resultCode: OSErr;
- max: LongInt;
-
- begin
- max := MaxBlock;
- h := nil;
- if (logicalSize < max) then
- h := NewHandle(logicalSize);
- { Utiliser la mémoire temporaire si l'appel à NewHandle n'a }
- { pas fonctionné }
- if (h = nil) then
- h := TempNewHandle(logicalSize, resultCode);
- MyNewHandle := h;
- end; { MyNewHandle }
- {$ENDC}
-
- {$IFC WINTARGET}
- function NewPtrClear(logicalSize: LongInt): Ptr;
- begin
- NewPtrClear := Ptr(HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, logicalSize));
- end;
-
- procedure DisposePtr;
- var
- b: Bool;
- begin
- b := HeapFree(GetProcessHeap, 0, LPVOID(p));
- {
- IF b <> 0 THEN
- DisposePtr := mNoErr
- ELSE
- DisposePtr := GetLastError;
- }
- end;
-
- procedure SetPtrSize(var p: univ Ptr; logicalSize: LongInt);
- var
- newP: Ptr;
- begin
- if (p <> nil) then begin
- newP := Ptr(HeapReAlloc(GetProcessHeap, 0, LPVOID(p), logicalSize));
- p := newP;
- end;
- end;
-
- function GetPtrSize(p: univ Ptr): LongInt;
- begin
- if (p = nil) then
- GetPtrSize := 0
- else
- GetPtrSize := HeapSize(GetProcessHeap, 0, LPVOID(p));
- end;
-
- procedure BlockMoveData(source: univ Ptr; dest: univ Ptr; nb: LongInt);
- type
- TBuffer = packed array[1..30000] of Char;
- TBufferPtr = ^TBuffer;
- var
- i: LongInt;
- begin
- for i := 1 to nb do
- TBufferPtr(dest)^[i] := TBufferPtr(source)^[i];
- { should use CopyMemory(dest, source, nb); but it has problems}
- end;
-
- function MemError;
- begin
- MemError := GetLastError;
- end;
-
- {$ENDC}
-
- end. { MyMemory }